package com.imagecollector.common.utils;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.Instant;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
import java.util.Date;

/**
 * @Author: wrf
 * @Date: 2024/6/28 10:25
 * @Description: 时间工具类
 */
public class DateTimeUtils {

    private static final String DEFAULT_DATE_FORMAT = "yyyy-MM-dd HH:mm:ss";

    // 格式化器：年月日时分秒
    private static final DateTimeFormatter DEFAULT_DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern(DEFAULT_DATE_FORMAT);

    /**
     * 将Date对象转换为LocalDateTime。
     */
    public static LocalDateTime convertToLocalDateTime(Date date) {
        return date.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
    }

    /**
     * 将LocalDateTime转换为Date对象。
     */
    public static Date convertToDate(LocalDateTime localDateTime) {
        return Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());
    }

    /**
     * 获取当前时间的LocalDateTime。
     */
    public static String now() {
        return formatStandardDateTime(LocalDateTime.now());
    }

    public static String formatStandardDateTime(LocalDateTime localDateTime) {
        return localDateTime.format(DEFAULT_DATE_TIME_FORMATTER);
    }

    /**
     * 字符串转LocalDateTime。
     *
     * @param dateTimeStr 时间字符串
     * @param pattern     时间格式
     * @return 转换后的LocalDateTime
     */
    public static LocalDateTime parseLocalDateTime(String dateTimeStr, String pattern) {
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern(pattern);
        return LocalDateTime.parse(dateTimeStr, formatter);
    }

    /**
     * LocalDateTime转换为指定格式的字符串。
     *
     * @param localDateTime 需要转换的LocalDateTime
     * @param pattern       输出格式
     * @return 格式化后的字符串
     */
    public static String format(LocalDateTime localDateTime, String pattern) {
        return localDateTime.format(DateTimeFormatter.ofPattern(pattern));
    }

    public static String formatDate(Date date, String format) {
        SimpleDateFormat sdf = new SimpleDateFormat(format);
        return sdf.format(date);
    }


    /**
     * 计算两个日期之间相差的天数。
     *
     * @param startDate 开始日期
     * @param endDate   结束日期
     * @return 相差的天数
     */
    public static long daysBetween(LocalDate startDate, LocalDate endDate) {
        return ChronoUnit.DAYS.between(startDate, endDate);
    }

    /**
     * 计算两个日期时间之间相差的秒数。
     *
     * @param startTime 开始时间
     * @param endTime   结束时间
     * @return 相差的秒数
     */
    public static long secondsBetween(LocalDateTime startTime, LocalDateTime endTime) {
        return ChronoUnit.SECONDS.between(startTime, endTime);
    }

    public static String getCurrentDateTime() {
        return DEFAULT_DATE_TIME_FORMATTER.format(LocalDateTime.now());
    }

    public static String getCurrentDateTime(String pattern) {
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern(pattern);
        return formatter.format(LocalDateTime.now());
    }


    /**
     * 将指定格式的字符串转换为日期时间戳。
     * 此方法接受一个日期字符串和一个格式字符串，尝试将日期字符串按照指定格式解析为日期对象，
     * 最后返回该日期对象表示的自1970年1月1日00:00:00 GMT以来的毫秒数。
     */
    public static long parseDateToMillis(String startTime, String format) {
        SimpleDateFormat sdf = new SimpleDateFormat(format);
        Date date;
        try {
            date = sdf.parse(startTime);
        } catch (ParseException e) {
            throw new RuntimeException(e);
        }
        // 返回解析得到的日期对象表示的毫秒数
        return date.getTime();
    }

    public static long parseDateToSeconds(String startTime, String format) {
        return parseDateToMillis(startTime, format) / 1000;
    }

    /**
     * 将秒数据按照给定格式转字符串
     */
    public static String format(Integer seconds, String pattern) {
        // 将秒转换为LocalDate
        LocalDateTime dateTime = Instant.ofEpochSecond(seconds)
                .atZone(ZoneId.systemDefault())
                .toLocalDateTime();
        // 自定义格式
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern(pattern);
        return dateTime.format(formatter);
    }

    public static LocalDateTime format(Integer seconds) {
        return Instant.ofEpochSecond(seconds)
                .atZone(ZoneId.systemDefault())
                .toLocalDateTime();
    }

    /**
     * 将字符串格式的时间转换为标准格式的 LocalDateTime 对象。
     */
    public static LocalDateTime format(String msgTime) {
        return LocalDateTime.parse(msgTime, DEFAULT_DATE_TIME_FORMATTER);
    }
}
